package net.joey.dm.create.abstractfactory;

/**
 * 抽象工厂类，所有的具体工厂实现之。该工厂中包含创建所有等级的一族的产品。
 * 族的概念 例如，该工厂能创建，水果，蔬菜。则一种水果和蔬菜就是一族。在本例中 南方水果，南方蔬菜为一族，北方水果，北方蔬菜为一族
 * 等级的概念 如 改工厂在水果方面可以创建 南方水果，北方水果。则这两个产品实质都是水果，只是类型不一样，叫做不同等级
 * 
 * 抽象工厂必须能够创建所有等级的一族产品，即，所有类型的产品。不同的具体工厂，去创建不同等级的一族产品。
 * 如果工厂中增加某一类产品，如，让工厂可以生产水稻，水稻包含南方水稻和北方旱稻两个等级，则该工厂必须增加一个方法，
 * createRice()。这样所有的子类必须都得重写，增加生产水稻的实现。因此，增加产品类型会给抽象工厂打击。
 * 如果某类产品中增加一个等级，如前面的水果中除了南方，北方水果，又增加一种西部水果，蔬菜中增加西部蔬菜，则只需要多增加一个工厂子类，
 * 创建这两个产品即可，因此抽象工厂更多是应付这种需求变化
 * @author gameuser
 *
 */
public interface Garder {
	/**
	 * 创建水果，由子类提供，可以是南方、北方、西部水果
	 * @return
	 */
	public Fruit createFruit();
	/**
	 * 创建蔬菜，由子类提供，可以是南方、北方、西部蔬菜
	 * @return
	 */
	public Vegetable createVegetable();
}
